package com.dongdongshop.service.impl;

import com.dongdongshop.constant.RedisConstant;
import com.dongdongshop.pojo.TbItem;
import com.dongdongshop.pojo.TbOrderItem;
import com.dongdongshop.service.CartService;
import com.dongdongshop.service.TbItemService;
import com.dongdongshop.util.RedisUtil;
import com.dongdongshop.vo.Cart;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
@DubboService
public class CartServiceImpl implements CartService {
    @DubboReference
    private TbItemService tbItemService;
    @Override
    public List<Cart> addCart(List<Cart> cartList, Long skuId, Integer num) {
        //更具商品id查看商品sku数据
        TbItem item = tbItemService.selectBySkuId(skuId);
        /*判断现在添加的商品之前有没有添加过*/
        /*获取商家ID*/
        String seller = item.getSeller();
        Cart oldCart = getCartFromCartListBySellerId(cartList, seller);
        if (oldCart == null){
            /*新添加的商品,之前没有添加过,创建一个新的购物车对象存放*/
            oldCart = new Cart();
            oldCart.setSellerId(seller);//商家ID
            /*Cart实体类中有一个用来存放商品sku的集合*/
            List<TbOrderItem> orderItemList = new ArrayList<>();
            /*创建TbOrderItem对象用于接收传过来的数据*/
            TbOrderItem orderItem = new TbOrderItem();
            orderItem.setSellerId(seller);//商家ID
            orderItem.setItemId(item.getId());/*商品skuId*/
            orderItem.setNum(num);//商品数量
            orderItem.setGoodsId(item.getGoodsId());//要买的商品spu的id
            orderItem.setPrice(item.getPrice());//商品价格
            orderItem.setTotalFee(new BigDecimal(item.getPrice().doubleValue() *num));//小计  数量*单价
            orderItem.setTitle(item.getTitle());//商品标题
            orderItem.setPicPath(item.getImage());//图片地址
            orderItem.setStatus("1");//默认待支付,状态：1、待支付 2、已支付 3、未退款，4、已退款 ,5部分退款',
            /*将TbOrderItem接收数据之后的对象添加到List<TbOrderItem>集合中*/
            orderItemList.add(orderItem);
            /*将List<TbOrderItem>集合存入Cart中的orderItemList属性中*/
            oldCart.setOrderItemList(orderItemList);
            /*最后在将Cart对象添加到List<Cart> cartList集合中*/
            cartList.add(oldCart);
        }else {/*新添加的商品,之前就有添加过*/
            List<TbOrderItem> orderItemList = oldCart.getOrderItemList();
            TbOrderItem orderItem = getOrderItemFromOrderItemListByItemId(orderItemList, item.getId());
            if (orderItem==null){/*如果是同一个商家不同的商品*/
                orderItem = new TbOrderItem();
                orderItem.setSellerId(seller);//商家ID
                orderItem.setItemId(item.getId());/*商品skuId*/
                orderItem.setNum(num);//商品数量
                orderItem.setGoodsId(item.getGoodsId());//要买的商品spu的id
                orderItem.setPrice(item.getPrice());//商品价格
                orderItem.setTotalFee(new BigDecimal(item.getPrice().doubleValue() *num));//小计  数量*单价
                orderItem.setTitle(item.getTitle());//商品标题
                orderItem.setPicPath(item.getImage());//图片地址
                orderItem.setStatus("1");//默认待支付,状态：1、待支付 2、已支付 3、未退款，4、已退款 ,5部分退款',
                /*如果是同一个商家不同的商品,将TbOrderItem接收数据之后的对象 追加 到List<TbOrderItem>集合中*/
                orderItemList.add(orderItem);
            }else {/*如果是同一个商家同一个商品*/
                orderItem.setNum(orderItem.getNum() + num);/*在之前商品的数量上添加这次的数量*/
                orderItem.setTotalFee(new BigDecimal(orderItem.getNum() * orderItem.getPrice().doubleValue()));/*更新价格*/
                if (orderItem.getNum().intValue() <= 0){//前台将商品数量删除
                    orderItemList.remove(orderItem);/*后台将商品信息所在的集合中的数据删除*/
                }
                /*如歌整个数据列表中的该商家的商品前部被移除,那么就将该商家移除*/
                if (orderItemList.size() <= 0){
                    /*cartList:全部商家所在的集合*/
                    /*oldCart 单个商家对象*/
                    cartList.remove(oldCart);
                }
            }
        }
        return cartList;
    }
    /*更具商家Id,从之前添加的商品集合中查询数据*/

    private Cart getCartFromCartListBySellerId(List<Cart> cartList, String seller){
        /*cartList之前添加的商品集合*/
        /*cart.getSellerId() 之前添加的商品的商家Id,*/
        /*seller现在添加的商品的商家id*/
        for (Cart cart : cartList) {
            if (cart.getSellerId().equals(seller)){
                return cart;
            }
        }
        /*新添加的商品,之前没有添加过*/
        return null;
    }
    //更具商品id,从原来添加的 该商家商品的集合 中查询 之前 有没有添加过这个商品
    private TbOrderItem getOrderItemFromOrderItemListByItemId(List<TbOrderItem> orderItemList,Long itemId){
        for (TbOrderItem orderItem : orderItemList) {
            //orderItem.getItemId()之前的商品sku的id
            //itemId现在添加的商品的sku的id
            if (orderItem.getItemId().equals(itemId)){ /*如果之前添加过*/
                return orderItem;
            }
        }
        return null;
    }

    @Override
    public List<Cart> selectCartListRedis(Long id) {
        RedisTemplate redis = RedisUtil.redis;
        /*从redis中获取用户收藏的的商家和商品*/
        List<Cart> cartList = (List<Cart>)redis.boundHashOps(RedisConstant.COOKIE_CARTLIST).get(id);
        return cartList == null ? new ArrayList<>() : cartList;
    }

    @Override
    public void addCartListRedis(List<Cart> cartList, Long id) {
        RedisTemplate redis = RedisUtil.redis;
        /*将每个用户的购物车数据,更具KEY:id和VALUE:List<Cart> 存入redis*/
        redis.boundHashOps(RedisConstant.COOKIE_CARTLIST).put(id,cartList);
    }
    /*合并购物车*/
    @Override
    public List<Cart> mergeCartList(List<Cart> carts, List<Cart> cartListRedis) {
        /*登录和没有登录的数据之间,只取对方独有的 */
        for (Cart cart : carts) {
            /*获取未登录的数据*/
            List<TbOrderItem> orderItemList = cart.getOrderItemList();
            for (TbOrderItem orderItem : orderItemList) {
                cartListRedis = addCart(cartListRedis, orderItem.getItemId(), orderItem.getNum());
            }
        }
        return cartListRedis;
    }
}
